package com.itheima.spring.bestpractive.common.util;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;

/**
 * @version 1.0
 * @author: HZY
 * @date: 2025/6/19 21:17
 * @Content:
 */
@Component
public class JwtUtil {
    // 密钥要至少32字节以上
    private static final String SECRET = "my_super_secret_key_which_is_long_enough!";

    private static final long EXPIRATION = 60 * 60 * 1000 * 24; // 24小时

    private final SecretKey key = Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8));

    // 生成token
    public String generateToken(String empId, String empName,long roleId) {
        return Jwts.builder()
                .setSubject(empId)     // 设置主题
                .claim("empName", empName)    // 添加自定义字段
                .claim("roleId",roleId)
                .setIssuedAt(new Date())    // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))   // 设置过期时间
                .signWith(key, SignatureAlgorithm.HS256)    // 设置密钥，密钥算法不同，所对应的密钥长度也不同256-32位，512-64位
                .compact(); //封装
    }

    // 解析token并返回Claims对象
    public Claims parseToken(String token) throws JwtException {
        return Jwts.parserBuilder()     // 创建JwtParserBuilder对象
                .setSigningKey(key)     // 设置密钥
                .build()    // 创建JwtParser对象
                .parseClaimsJws(token)  // 解析token
                .getBody(); // 返回Claims对象
    }

    // 判断token是否过期
    //没用，因为解析器在自动解析的时候就会进行过期判断
    public boolean isTokenExpired(String token) {
        try {
            Claims claims = parseToken(token);
            Date expiration = claims.getExpiration(); // 读取 exp 字段
            return expiration.before(new Date());     // 如果过期时间在当前时间之前，则已过期
        } catch (ExpiredJwtException e) {
            return true;
        } catch (Exception e) {
            return true; // 其他异常也判为无效
        }
    }
}
